看到題目要求,知道解題的方法是讓 warrior 一直輸,並且提示告訴我們,這題和 CoreWars 有關。
hint 1:CoreWars is a well-established game with a lot of docs and strategy
hint 2:Experiment with input to the CoreWars handler or create a self-defeating bot
那我們先來看看什麼是 CoreWars 。
CoreWars 起源於20世紀80年代,是一種由抽象組合語言 Redcode 寫成的遊戲。在這個遊戲中,玩家撰寫程序(稱為 warrior),並在一個模擬器中讓這些戰士彼此對抗。其中 CoreWars 的模擬器稱為MARS(Memory Array Redcode Simulator),它模擬了戰士的運行環境。
詳情可見:Core_War
使用 cat
讀取題目給的 imp.red 檔,會看到 Redcode,裡面的動作是 mov 0, 1
。
$ cat imp.red
;redcode
;name Imp Ex
;assert 1
mov 0, 1
end
試著連上 webshell,並將 imp.red 作為輸入,會發現我們的 warrior 持續平手。而題目想要的是我們的 warrior 持續輸。
$ nc saturn.picoctf.net 63726 < imp.red
;redcode
;name Imp Ex
;assert 1
mov 0, 1
end
Submit your warrior: (enter 'end' when done)
Warrior1:
;redcode
;name Imp Ex
;assert 1
mov 0, 1
end
Rounds: 100
Warrior 1 wins: 0
Warrior 2 wins: 0
Ties: 100
Try again. Your warrior (warrior 1) must lose all rounds, no ties
於是我們來看 Corewars 的使用指南 ( https://vyznev.net/corewar/guide.html ),發現 mov
這個動作是複製資料到其他位置。
上下查看,dat
是結束這個 process,nop
是不執行動作,於是我們猜測這兩個指令或許能讓我們的 warrior 持續輸。
首先將指令改成 dat
,發現成功的得到 flag 了。
$ nc saturn.picoctf.net 63726 < imp.red
;redcode
;name Imp Ex
;assert 1
dat 0, 1
end
Submit your warrior: (enter 'end' when done)
Warrior1:
;redcode
;name Imp Ex
;assert 1
dat 0, 1
end
Rounds: 100
Warrior 1 wins: 0
Warrior 2 wins: 100
Ties: 0
You did it!
picoCTF{h3r0_t0_z3r0_4m1r1gh7_f1e207c4}
再試著用 nop
,發現也可以使 warrior 一直輸。
$ nc saturn.picoctf.net 63726 < imp.red
;redcode
;name Imp Ex
;assert 1
nop 0, 1
end
Submit your warrior: (enter 'end' when done)
Warrior1:
;redcode
;name Imp Ex
;assert 1
nop 0, 1
end
Rounds: 100
Warrior 1 wins: 0
Warrior 2 wins: 100
Ties: 0
You did it!
picoCTF{h3r0_t0_z3r0_4m1r1gh7_f1e207c4}
小結:
認識 CoreWars 是甚麼,還有 Redcode 中基本指令。